package com.wgy.day31字节流.字节输入流;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by pc on 2020/12/3 20:31
 * Description: LearningJava
 */
/*
Java.io.InputStream:字节输入流.  此抽象类是表示字节输入流的所有类的超类

定义了所有子类共性的方法:
  int read() :从输入流中读取数据的下一个字节,(一次读取一个字节,每读取一次,指针就向后移动一个字节)
     返回值int:返回每次读取到的一个字节数,
              如果读取到文件的末尾(文件结束末尾默认有结束标记,只是不显示出来),就会读取到"结束标记",返回-1值.

  int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中(一次读取多个字节)
           参数byte[]:起到缓冲作用,存储每次读取的每个字节
                     数组的长度一般定义为1024(1kb)或者1024的倍数
            返回值int:每次读取的有效字节个数

  void close():关闭此输入流并释放与该流关联的所有系统资源

Java.io.FileInputStream extends InputStream
FileInputStream:文件字节输入流
            作用:把硬盘文件中的数据,读取到内存中使用
         构造方法:FileInputStream(String name):创建一个向具有指定名称的文件中写入数据的文件输出流
                 FileInputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流
                 参数:读取文件的数据源
                     String name:文件的路径
                       File file:文件
      构造方法作用: 1.创建FileInputStream对象
                  2.会把FileInputStream对象指向构造方法中要读取的文件/文件路径

    读取数据的原理: java程序->JVM(java虚拟机)->OS(操作系统)->OS调用读取数据的方法->读取文件

字节输入流的使用步骤:1.创建一个FileInputStream对象,构造方法中绑定要读取的数据源
                 2.调用FileInputStream对象中的方法read,读取文件
                 3.释放资源(流使用会占用一定的内存,使用完毕后要把内存清空,提高程序的效率)

*/
public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
        //1.创建一个FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\小云\\abc\\b\\b.txt");//源文件:abc
        //2.调用FileInputStream对象中的方法read,读取文件
      /*int len = fis.read();
        System.out.println(len); //97 a 一次读取一个字节
        len = fis.read();
        System.out.println(len);//98  b
        len = fis.read();
        System.out.println(len);//99  c
        len = fis.read();
        System.out.println(len);//-1  文件读取完毕,后返回-1
        len = fis.read();
        System.out.println(len);//-1
        */

     /*发现以上的读取文件是一个重复的过程,可以使用循环优化,
     不知道文件中有多少个字节,使用while循环
     while 循环结束条件,读取到-1的时候结束
     布尔表达式 (len=fis.read())!= -1
              1.fis.read():读取文件的下一个字节
              2.len=fis.read():将读取到的字节赋值给变量len
              3.(len=fis.read())!= -1:判断变量len是否不等于-1
     */
        int len=0;//记录读取到的字节
        while ((len=fis.read())!= -1) {
            System.out.println((char) len);
        }

        //3.释放资源
        fis.close();
    }
}
